package cn.yza.并发.Semaphore;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * @author Honglixi
 * @create 2021-10-31 14:52
 */
public class Student extends Thread{
    private Semaphore sp = null;
    private String name = null;

    public Student(Semaphore sp, String name) {
        this.sp = sp;
        this.name = name;
    }

    @Override
    public void run() {
        try {
            System.out.println(name + "进入了餐厅");

            //1、当前线程会尝试去同步队列获取一个许可，获取许可的过程也就是使用原子的操作去修改同步队列的state ,获取一个许可则修改为state=state-1。
            //
            //2、 当计算出来的state<0，则代表许可数量不足，此时会创建一个Node节点加入阻塞队列，挂起当前线程。
            //
            //3、当计算出来的state>=0，则代表获取许可成功。
            sp.acquire();

            System.out.println(name + "拿到了打饭的许可");
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println(name + "打好了饭，释放这个窗口");

//            当调用semaphore.release() 方法时
//
//            1、线程会尝试释放一个许可，释放许可的过程也就是把同步队列的state修改为state=state+1的过程
//
//            2、释放许可成功之后，同时会唤醒同步队列的所有阻塞节共享节点线程
//
//            3、被唤醒的节点会重新尝试去修改state=state-1 的操作，如果state>=0则获取许可成功，否则重新进入阻塞队列，挂起线程。
            sp.release();
        }
    }
}
